#!/bin/bash

# Minecraft 服务器自动更新脚本
# 作者：AI助手
# 描述：自动检测并更新Minecraft Java版和基岩版服务器

# 默认配置文件路径
CONFIG_FILE="./config.json"

# 参数处理
show_help() {
    echo "用法: $0 [配置选项] [命令选项]"
    echo "配置选项:"
    echo "  -c, --config=FILE    指定配置文件路径 (默认: ./config.json)"
    echo "  -v, --version=VERSION 指定要安装的版本号 (例如: 1.21.80.3)"
    echo "命令选项:"
    echo "  -j, --java           更新Java版Minecraft服务器"
    echo "  -b, --bedrock        更新基岩版Minecraft服务器"
    echo "  -a, --all            更新所有配置的服务器"
    echo "  -h, --help           显示帮助信息"
    exit 0
}

# 检查是否为帮助选项
for arg in "$@"; do
    if [ "$arg" = "-h" ] || [ "$arg" = "--help" ]; then
        show_help
    fi
done

# 加载工具函数模块
source ./utils.sh

# 解析命令行参数，检查是否指定了配置文件
for arg in "$@"; do
    case $arg in
        -c=*|--config=*)
            CONFIG_FILE="${arg#*=}"
            # 从参数列表中移除配置文件参数
            shift
            ;;
        -v=*|--version=*)
            SPECIFIED_VERSION="${arg#*=}"
            shift
            ;;
    esac
done

# 加载配置
load_config "$CONFIG_FILE"

# 加载特定版本的更新模块
source ./java_updater.sh 
source ./bedrock_updater.sh

# 显示欢迎信息
echo -e "\e[1;36m==================================================="
echo -e "      Minecraft 服务器自动更新工具"
echo -e "===================================================\e[0m"
echo ""

# 函数：交互式版本输入
ask_for_version() {
    local server_type="$1"
    local default_version="最新版本"
    
    log_info "选择$server_type版本"
    log_info "您可以指定版本号或使用最新版本"
    
    echo -e "\e[1;32m请选择操作:\e[0m"
    echo -e "  1) 自动检测并安装最新版本"
    echo -e "  2) 手动指定版本号"
    
    read -p "请输入选项 [1/2] (默认: 1): " choice
    
    case "$choice" in
        2)
            read -p "请输入要安装的版本号 (例如: 1.21.80.3): " input_version
            if [ -n "$input_version" ]; then
                log_info "将安装指定版本: $input_version"
                SPECIFIED_VERSION="$input_version"
                return 0
            else
                log_warning "未提供有效的版本号，将使用最新版本"
                SPECIFIED_VERSION=""
                return 1
            fi
            ;;
        *)
            log_info "将安装最新版本"
            SPECIFIED_VERSION=""
            return 1
            ;;
    esac
}

# 初始化和检查依赖
check_and_install_dependencies() {
    # 检查是否具有sudo权限
    if command -v sudo > /dev/null && sudo -n true 2>/dev/null; then
        HAS_SUDO=true
    else
        HAS_SUDO=false
        log_warning "没有sudo权限，如果需要安装依赖，可能会失败"
    fi
    
    # 检查jq
    if ! command -v jq > /dev/null; then
        log_warning "未找到jq命令，尝试安装..."
        if [ "$HAS_SUDO" = true ]; then
            if command -v apt-get > /dev/null; then
                sudo apt-get update && sudo apt-get install -y jq
            elif command -v yum > /dev/null; then
                sudo yum install -y jq
            elif command -v dnf > /dev/null; then
                sudo dnf install -y jq
            else
                log_error "无法确定包管理器，请手动安装jq"
                return 1
            fi
        else
            log_error "没有sudo权限，无法安装jq，请手动安装"
            return 1
        fi
    fi
    
    # 检查curl或wget
    if ! command -v curl > /dev/null && ! command -v wget > /dev/null; then
        log_warning "未找到curl或wget命令，尝试安装..."
        if [ "$HAS_SUDO" = true ]; then
            if command -v apt-get > /dev/null; then
                sudo apt-get update && sudo apt-get install -y curl
            elif command -v yum > /dev/null; then
                sudo yum install -y curl
            elif command -v dnf > /dev/null; then
                sudo dnf install -y curl
            else
                log_error "无法确定包管理器，请手动安装curl或wget"
                return 1
            fi
        else
            log_error "没有sudo权限，无法安装curl或wget，请手动安装"
            return 1
        fi
    fi
    
    # 检查unzip
    if ! command -v unzip > /dev/null; then
        log_warning "未找到unzip命令，尝试安装..."
        if [ "$HAS_SUDO" = true ]; then
            if command -v apt-get > /dev/null; then
                sudo apt-get update && sudo apt-get install -y unzip
            elif command -v yum > /dev/null; then
                sudo yum install -y unzip
            elif command -v dnf > /dev/null; then
                sudo dnf install -y unzip
            else
                log_error "无法确定包管理器，请手动安装unzip"
                return 1
            fi
        else
            log_error "没有sudo权限，无法安装unzip，请手动安装"
            return 1
        fi
    fi
    
    # 检查screen
    if ! command -v screen > /dev/null; then
        log_warning "未找到screen命令，尝试安装..."
        if [ "$HAS_SUDO" = true ]; then
            if command -v apt-get > /dev/null; then
                sudo apt-get update && sudo apt-get install -y screen
            elif command -v yum > /dev/null; then
                sudo yum install -y screen
            elif command -v dnf > /dev/null; then
                sudo dnf install -y screen
            else
                log_error "无法确定包管理器，请手动安装screen"
                return 1
            fi
        else
            log_error "没有sudo权限，无法安装screen，请手动安装"
            return 1
        fi
    fi
    
    return 0
}

# 检查并安装必要的依赖项
check_and_install_dependencies || {
    log_error "无法满足依赖项要求，脚本将退出"
    exit 1
}

# 无参数时显示交互式菜单
if [ $# -eq 0 ] || ([ $# -eq 1 ] && [[ $1 == -c=* || $1 == --config=* ]]); then
    echo -e "\e[1;32m请选择要更新的服务器类型:\e[0m"
    echo -e "  1) Java版Minecraft服务器"
    echo -e "  2) 基岩版Minecraft服务器"
    echo -e "  3) 所有服务器"
    echo -e "  4) 退出"
    
    read -p "请输入选项 [1-4]: " menu_choice
    
    case "$menu_choice" in
        1)
            ask_for_version "Java版"
            if [ -n "$SPECIFIED_VERSION" ]; then
                JAVA_VERSION="$SPECIFIED_VERSION"
            fi
            update_java_server
            ;;
        2)
            ask_for_version "基岩版"
            if [ -n "$SPECIFIED_VERSION" ]; then
                BEDROCK_VERSION="$SPECIFIED_VERSION"
            fi
            update_bedrock_server
            ;;
        3)
            ask_for_version "所有服务器"
            if [ -n "$SPECIFIED_VERSION" ]; then
                JAVA_VERSION="$SPECIFIED_VERSION"
                BEDROCK_VERSION="$SPECIFIED_VERSION"
            fi
            update_java_server
            update_bedrock_server
            ;;
        4|*)
            echo -e "\e[1;33m已取消操作\e[0m"
            exit 0
            ;;
    esac
    
    log_info "更新操作完成！"
    exit 0
fi

# 参数解析
while [[ $# -gt 0 ]]; do
    case $1 in
        -j|--java)
            log_info "开始更新Java版Minecraft服务器..."
            # 如果没有通过命令行参数指定版本，请求用户输入
            if [ -z "$SPECIFIED_VERSION" ]; then
                ask_for_version "Java版"
            fi
            
            if [ -n "$SPECIFIED_VERSION" ]; then
                log_info "使用指定版本: $SPECIFIED_VERSION"
                # 临时修改配置中的版本号
                JAVA_VERSION="$SPECIFIED_VERSION"
            fi
            update_java_server
            shift
            ;;
        -b|--bedrock)
            log_info "开始更新基岩版Minecraft服务器..."
            # 如果没有通过命令行参数指定版本，请求用户输入
            if [ -z "$SPECIFIED_VERSION" ]; then
                ask_for_version "基岩版"
            fi
            
            if [ -n "$SPECIFIED_VERSION" ]; then
                log_info "使用指定版本: $SPECIFIED_VERSION"
                # 临时修改配置中的版本号
                BEDROCK_VERSION="$SPECIFIED_VERSION"
            fi
            update_bedrock_server
            shift
            ;;
        -a|--all)
            log_info "开始更新所有Minecraft服务器..."
            # 如果没有通过命令行参数指定版本，请求用户输入
            if [ -z "$SPECIFIED_VERSION" ]; then
                ask_for_version "所有服务器"
            fi
            
            if [ -n "$SPECIFIED_VERSION" ]; then
                log_info "使用指定版本: $SPECIFIED_VERSION"
                # 临时修改配置中的版本号
                JAVA_VERSION="$SPECIFIED_VERSION"
                BEDROCK_VERSION="$SPECIFIED_VERSION"
            fi
            update_java_server
            update_bedrock_server
            shift
            ;;
        -h|--help)
            show_help
            shift
            ;;
        -c=*|--config=*|-v=*|--version=*)
            # 已经处理过了
            shift
            ;;
        *)
            log_error "未知参数: $1"
            show_help
            shift
            ;;
    esac
done

log_info "更新操作完成！"
exit 0 